The 2019-2020 Coronavirus Pandemic Analysis

Contact: Smith Research

BACKGROUND & APPROACH

I wanted to track and trend the coronavirus outbreak on my own curiosity. There are some interesting questions that may fall out of this, as it is a very historic moment, including scientifically and analytically (we have a large amount of data being shared across the globe, analyzed in real-time). The world has come to a halt because of it.
This analysis attempts to answer the following questions (more to come):

  1. What does the trend of the pandemic look like to date?
  2. What are future case predictions based on historical model?
  3. What interesting quirks or patterns emerge?

ASSUMPTIONS & LIMITATIONS: * This data is limited by the source. I realized early on that depending on source there were conflicting # of cases. Originally I was using JHU data… but this was always ‘ahead’ of the Our World In Data. I noticed that JHU’s website was buggy- you clicked on the U.S. stats but it didn’t reflect the U.S.. So I changed data sources to be more consistent with what is presented in the media (and Our World In Data has more extensive plots I can compare my own to). An interesting aside might be why the discrepancy? Was I missing something?
* Defintiions are important as is the idea that multiple varibales accumulate in things like total cases (more testing for example).

SOURCE RAW DATA: * https://ourworldindata.org/coronavirus
* https://github.com/CSSEGISandData/COVID-19/
*

INPUT DATA LOCATION: github (https://github.com/sbs87/coronavirus/tree/master/data)

OUTPUT DATA LOCATIOn: github (https://github.com/sbs87/coronavirus/tree/master/results)

TIMESTAMP

Start: ##—— Sat May 23 10:51:05 2020 ——##

PRE-ANALYSIS

The following sections are outside the scope of the ‘analysis’ but are still needed to prepare everything

UPSTREAM PROCESSING/ANALYSIS

  1. Google Mobility Scraping, script available at get_google_mobility.py
# Mobility data has to be extracted from Google PDF reports using a web scraping script (python , written by Peter Simone, https://github.com/petersim1/MIT_COVID19)

# See get_google_mobility.py for local script 

python3 get_google_mobility.py
# writes csv file of mobility data as "mobility.csv"

SET UP ENVIORNMENT

Load libraries and set global variables

# timestamp start
timestamp()
## ##------ Sat May 23 10:51:05 2020 ------##

# clear previous enviornment
rm(list = ls())

##------------------------------------------
## LIBRARIES
##------------------------------------------
library(plyr)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.0     ✓ purrr   0.3.3
## ✓ tibble  3.0.0     ✓ dplyr   0.8.5
## ✓ tidyr   1.0.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::arrange()   masks plyr::arrange()
## x purrr::compact()   masks plyr::compact()
## x dplyr::count()     masks plyr::count()
## x dplyr::failwith()  masks plyr::failwith()
## x dplyr::filter()    masks stats::filter()
## x dplyr::id()        masks plyr::id()
## x dplyr::lag()       masks stats::lag()
## x dplyr::mutate()    masks plyr::mutate()
## x dplyr::rename()    masks plyr::rename()
## x dplyr::summarise() masks plyr::summarise()
## x dplyr::summarize() masks plyr::summarize()
library(ggplot2)
library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(plot.utils)
library(utils)
library(knitr)

##------------------------------------------

##------------------------------------------
# GLOBAL VARIABLES
##------------------------------------------
user_name <- Sys.info()["user"]
working_dir <- paste0("/Users/", user_name, "/Projects/coronavirus/")  # don't forget trailing /
results_dir <- paste0(working_dir, "results/")  # assumes diretory exists
results_dir_custom <- paste0(results_dir, "custom/")  # assumes diretory exists


Corona_Cases.source_url <- "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
Corona_Cases.US.source_url <- "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_US.csv"
Corona_Deaths.US.source_url <- "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_US.csv"
Corona_Deaths.source_url <- "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"

Corona_Cases.fn <- paste0(working_dir, "data/", basename(Corona_Cases.source_url))
Corona_Cases.US.fn <- paste0(working_dir, "data/", basename(Corona_Cases.US.source_url))
Corona_Deaths.fn <- paste0(working_dir, "data/", basename(Corona_Deaths.source_url))
Corona_Deaths.US.fn <- paste0(working_dir, "data/", basename(Corona_Deaths.US.source_url))
default_theme <- theme_bw() + theme(text = element_text(size = 14))  # fix this
##------------------------------------------

FUNCTIONS

List of functions

function_name description
prediction_model outputs case estumate for given log-linear moder parameters slope and intercept
make_long converts input data to long format (specialized cases)
name_overlaps outputs the column names intersection and set diffs of two data frame
find_linear_index finds the first date at which linearaity occurs
##------------------------------------------
## FUNCTION: prediction_model
##------------------------------------------
## --- //// ----
# Takes days vs log10 (case) linear model parameters and a set of days since 100 cases and outputs a dataframe with total number of predicted cases for those days
## --- //// ----
prediction_model<-function(m=1,b=0,days=1){
  total_cases<-m*days+b
  total_cases.log<-log(total_cases,10)
  prediction<-data.frame(days=days,Total_confirmed_cases_perstate=total_cases)
  return(prediction)
}
##------------------------------------------

##------------------------------------------
## FUNCTION: make_long
##------------------------------------------
## --- //// ----
# Takes wide-format case data and converts into long format, using date and total cases as variable/values. Also enforces standardization/assumes data struture naming by using fixed variable name, value name, id.vars, 
## --- //// ----
make_long<-function(data_in,variable.name = "Date",
                   value.name = "Total_confirmed_cases",
                   id.vars=c("case_type","Province.State","Country.Region","Lat","Long","City","Population")){

long_data<-melt(data_in,
                id.vars = id.vars,
                variable.name=variable.name,
                value.name=value.name)
return(long_data)

}
##------------------------------------------

## THIS WILL BE IN UTILS AT SOME POINT
name_overlaps<-function(df1,df2){
i<-intersect(names(df1),
names(df2))
sd1<-setdiff(names(df1),
names(df2))
sd2<-setdiff(names(df2),names(df1))
cat("intersection:\n",paste(i,"\n"))
cat("in df1 but not df2:\n",paste(sd1,"\n"))
cat("in df2 but not df1:\n",paste(sd2,"\n"))
return(list("int"=i,"sd_1_2"=sd1,"sd_2_1"=sd2))
}

##------------------------------------------

##------------------------------------------
## FUNCTION: find_linear_index
##------------------------------------------
## --- //// ----
# Find date at which total case data is linear (for a given data frame) 
## --- //// ----

find_linear_index<-function(tmp,running_avg=5){
  tmp$Total_confirmed_cases_perstate.log<-log(tmp$Total_confirmed_cases_perstate,2)
  derivative<-data.frame(matrix(nrow = nrow(tmp),ncol = 4))
  names(derivative)<-c("m.time","mm.time","cumsum","date")
  
  # First derivative
  for(t in 2:nrow(tmp)){
    slope.t<- tmp[t,"Total_confirmed_cases_perstate.log"]- tmp[t-1,"Total_confirmed_cases_perstate.log"]
    derivative[t,"m.time"]<-slope.t
    derivative[t,"date"]<-as.Date(tmp[t,"Date"])
  }
  
  # Second derivative
  for(t in 2:nrow(derivative)){
    slope.t<- derivative[t,"m.time"]- derivative[t-1,"m.time"]
    derivative[t,"mm.time"]<-slope.t
  }
  
  #Compute running sum of second derivative (window = 5). Choose point at which within 0.2
  for(t in running_avg:nrow(derivative)){
    slope.t<- sum(abs(derivative[t:(t-4),"mm.time"])<0.2,na.rm = T)
    derivative[t,"cumsum"]<-slope.t
  }
  
  #Find date -5 from the stablility point
  linear_begin<-min(derivative[!is.na(derivative$cumsum) & derivative$cumsum==running_avg,"date"])-running_avg
  
  return(linear_begin)
}

READ IN DATA

# Q: do we want to archive previous versions? Maybe an auto git mv?

##------------------------------------------
## Download and read in latest data from github
##------------------------------------------
download.file(Corona_Cases.source_url, destfile = Corona_Cases.fn)
Corona_Totals.raw <- read.csv(Corona_Cases.fn, header = T, stringsAsFactors = F)

download.file(Corona_Cases.US.source_url, destfile = Corona_Cases.US.fn)
Corona_Totals.US.raw <- read.csv(Corona_Cases.US.fn, header = T, stringsAsFactors = F)

download.file(Corona_Deaths.source_url, destfile = Corona_Deaths.fn)
Corona_Deaths.raw <- read.csv(Corona_Deaths.fn, header = T, stringsAsFactors = F)

download.file(Corona_Deaths.US.source_url, destfile = Corona_Deaths.US.fn)
Corona_Deaths.US.raw <- read.csv(Corona_Deaths.US.fn, header = T, stringsAsFactors = F)

# latest date on all data:
paste("US deaths:", names(Corona_Deaths.US.raw)[ncol(Corona_Deaths.US.raw)])
## [1] "US deaths: X5.22.20"
paste("US total:", names(Corona_Totals.US.raw)[ncol(Corona_Totals.US.raw)])
## [1] "US total: X5.22.20"
paste("World deaths:", names(Corona_Deaths.raw)[ncol(Corona_Deaths.raw)])
## [1] "World deaths: X5.22.20"
paste("World total:", names(Corona_Totals.raw)[ncol(Corona_Totals.raw)])
## [1] "World total: X5.22.20"

PROCESS DATA

  • Convert to long format
  • Fix date formatting/convert to numeric date
  • Log10 transform total # cases
##------------------------------------------
## Combine death and total data frames
##------------------------------------------
Corona_Totals.raw$case_type<-"total"
Corona_Totals.US.raw$case_type<-"total"
Corona_Deaths.raw$case_type<-"death"
Corona_Deaths.US.raw$case_type<-"death"

# for some reason, Population listed in US death file but not for other data... Weird. When combining, all datasets will have this column, but US deaths is the only useful one.  
Corona_Totals.US.raw$Population<-"NA" 
Corona_Totals.raw$Population<-"NA"
Corona_Deaths.raw$Population<-"NA"

Corona_Cases.raw<-rbind(Corona_Totals.raw,Corona_Deaths.raw)
Corona_Cases.US.raw<-rbind(Corona_Totals.US.raw,Corona_Deaths.US.raw)
#TODO: custom utils- setdiff, intersect names... option to output in merging too
##------------------------------------------
# prepare raw datasets for eventual combining
##------------------------------------------
Corona_Cases.raw$City<-"NA" # US-level data has Cities
Corona_Cases.US.raw$Country_Region<-"US_state" # To differentiate from World-level stats

Corona_Cases.US.raw<-plyr::rename(Corona_Cases.US.raw,c("Province_State"="Province.State",
                                                  "Country_Region"="Country.Region",
                                                  "Long_"="Long",
                                                  "Admin2"="City"))


##------------------------------------------
## Convert to long format
##------------------------------------------
#JHU has a gross file format. It's in wide format with each column is the date in MM/DD/YY. So read this in as raw data but trasnform it to be better suited for analysis
# Furthermore, the World and US level data is formatted differently, containing different columns, etc. Recitfy this and combine the world-level stats with U.S. level stats.

Corona_Cases.long<-rbind(make_long(select(Corona_Cases.US.raw,-c(UID,iso2,iso3,code3,FIPS,Combined_Key))),
make_long(Corona_Cases.raw))


##------------------------------------------
## Fix date formatting, convert to numeric date
##------------------------------------------
Corona_Cases.long$Date<-gsub(Corona_Cases.long$Date,pattern = "^X",replacement = "0") # leading 0 read in as X
Corona_Cases.long$Date<-gsub(Corona_Cases.long$Date,pattern = "20$",replacement = "2020") # ends in .20 and not 2020
Corona_Cases.long$Date<-as.Date(Corona_Cases.long$Date,format = "%m.%d.%y")
Corona_Cases.long$Date.numeric<-as.numeric(Corona_Cases.long$Date)

kable(table(select(Corona_Cases.long,c("Country.Region","case_type"))),caption = "Number of death and total case longitudinal datapoints per geographical region")
Number of death and total case longitudinal datapoints per geographical region
death total
Afghanistan 122 122
Albania 122 122
Algeria 122 122
Andorra 122 122
Angola 122 122
Antigua and Barbuda 122 122
Argentina 122 122
Armenia 122 122
Australia 976 976
Austria 122 122
Azerbaijan 122 122
Bahamas 122 122
Bahrain 122 122
Bangladesh 122 122
Barbados 122 122
Belarus 122 122
Belgium 122 122
Belize 122 122
Benin 122 122
Bhutan 122 122
Bolivia 122 122
Bosnia and Herzegovina 122 122
Botswana 122 122
Brazil 122 122
Brunei 122 122
Bulgaria 122 122
Burkina Faso 122 122
Burma 122 122
Burundi 122 122
Cabo Verde 122 122
Cambodia 122 122
Cameroon 122 122
Canada 1708 1708
Central African Republic 122 122
Chad 122 122
Chile 122 122
China 4026 4026
Colombia 122 122
Comoros 122 122
Congo (Brazzaville) 122 122
Congo (Kinshasa) 122 122
Costa Rica 122 122
Cote d’Ivoire 122 122
Croatia 122 122
Cuba 122 122
Cyprus 122 122
Czechia 122 122
Denmark 366 366
Diamond Princess 122 122
Djibouti 122 122
Dominica 122 122
Dominican Republic 122 122
Ecuador 122 122
Egypt 122 122
El Salvador 122 122
Equatorial Guinea 122 122
Eritrea 122 122
Estonia 122 122
Eswatini 122 122
Ethiopia 122 122
Fiji 122 122
Finland 122 122
France 1342 1342
Gabon 122 122
Gambia 122 122
Georgia 122 122
Germany 122 122
Ghana 122 122
Greece 122 122
Grenada 122 122
Guatemala 122 122
Guinea 122 122
Guinea-Bissau 122 122
Guyana 122 122
Haiti 122 122
Holy See 122 122
Honduras 122 122
Hungary 122 122
Iceland 122 122
India 122 122
Indonesia 122 122
Iran 122 122
Iraq 122 122
Ireland 122 122
Israel 122 122
Italy 122 122
Jamaica 122 122
Japan 122 122
Jordan 122 122
Kazakhstan 122 122
Kenya 122 122
Korea, South 122 122
Kosovo 122 122
Kuwait 122 122
Kyrgyzstan 122 122
Laos 122 122
Latvia 122 122
Lebanon 122 122
Lesotho 122 122
Liberia 122 122
Libya 122 122
Liechtenstein 122 122
Lithuania 122 122
Luxembourg 122 122
Madagascar 122 122
Malawi 122 122
Malaysia 122 122
Maldives 122 122
Mali 122 122
Malta 122 122
Mauritania 122 122
Mauritius 122 122
Mexico 122 122
Moldova 122 122
Monaco 122 122
Mongolia 122 122
Montenegro 122 122
Morocco 122 122
Mozambique 122 122
MS Zaandam 122 122
Namibia 122 122
Nepal 122 122
Netherlands 610 610
New Zealand 122 122
Nicaragua 122 122
Niger 122 122
Nigeria 122 122
North Macedonia 122 122
Norway 122 122
Oman 122 122
Pakistan 122 122
Panama 122 122
Papua New Guinea 122 122
Paraguay 122 122
Peru 122 122
Philippines 122 122
Poland 122 122
Portugal 122 122
Qatar 122 122
Romania 122 122
Russia 122 122
Rwanda 122 122
Saint Kitts and Nevis 122 122
Saint Lucia 122 122
Saint Vincent and the Grenadines 122 122
San Marino 122 122
Sao Tome and Principe 122 122
Saudi Arabia 122 122
Senegal 122 122
Serbia 122 122
Seychelles 122 122
Sierra Leone 122 122
Singapore 122 122
Slovakia 122 122
Slovenia 122 122
Somalia 122 122
South Africa 122 122
South Sudan 122 122
Spain 122 122
Sri Lanka 122 122
Sudan 122 122
Suriname 122 122
Sweden 122 122
Switzerland 122 122
Syria 122 122
Taiwan* 122 122
Tajikistan 122 122
Tanzania 122 122
Thailand 122 122
Timor-Leste 122 122
Togo 122 122
Trinidad and Tobago 122 122
Tunisia 122 122
Turkey 122 122
Uganda 122 122
Ukraine 122 122
United Arab Emirates 122 122
United Kingdom 1342 1342
Uruguay 122 122
US 122 122
US_state 397842 397842
Uzbekistan 122 122
Venezuela 122 122
Vietnam 122 122
West Bank and Gaza 122 122
Western Sahara 122 122
Yemen 122 122
Zambia 122 122
Zimbabwe 122 122
# Decouple population and lat/long data, refactor to make it more tidy
metadata_columns<-c("Lat","Long","Population")
metadata<-unique(select(filter(Corona_Cases.long,case_type=="death"),c("Country.Region","Province.State","City",all_of(metadata_columns))))
Corona_Cases.long<-select(Corona_Cases.long,-all_of(metadata_columns))

# Some counties are not summarized on the country level. collapse all but US
Corona_Cases.long<-rbind.fill(ddply(filter(Corona_Cases.long,!Country.Region=="US_state"),c("case_type","Country.Region","Date","Date.numeric"),summarise,Total_confirmed_cases=sum(Total_confirmed_cases)),filter(Corona_Cases.long,Country.Region=="US_state"))

# Put total case and deaths side-by-side (wide)
Corona_Cases<-spread(Corona_Cases.long,key = case_type,value = Total_confirmed_cases)

#Compute moratlity rate
Corona_Cases$mortality_rate<-Corona_Cases$death/Corona_Cases$total

#TMP
Corona_Cases<-plyr::rename(Corona_Cases,c("total"="Total_confirmed_cases","death"="Total_confirmed_deaths"))

##------------------------------------------
## log10 transform total # cases
##------------------------------------------
Corona_Cases$Total_confirmed_cases.log<-log(Corona_Cases$Total_confirmed_cases,10)
Corona_Cases$Total_confirmed_deaths.log<-log(Corona_Cases$Total_confirmed_deaths,10)
##------------------------------------------
       
##------------------------------------------
## Compute # of days since 100th for US data
##------------------------------------------

# Find day that 100th case was found for Country/Province. NOTE: Non US countries may have weird provinces. For example, Frane is summairzed at the country level but also had 3 providences. I've only ensured the U.S. case100 works... so the case100_date for U.S. is summarized both for the entire country (regardless of state) and on a per-state level. 
# TODO: consider city-level summary as well. This data may be sparse

Corona_Cases<-merge(Corona_Cases,ddply(filter(Corona_Cases,Total_confirmed_cases>100),c("Country.Region"),summarise,case100_date=min(Date.numeric)))
Corona_Cases$Days_since_100<-Corona_Cases$Date.numeric-Corona_Cases$case100_date

##------------------------------------------
## Add population and lat/long data (CURRENTLY US ONLY)
##------------------------------------------

kable(filter(metadata,(is.na(Country.Region) | is.na(Population) )) %>% select(c("Country.Region","Province.State","City")) %>% unique(),caption = "Regions for which either population or Country is NA")
Regions for which either population or Country is NA
Country.Region Province.State City
# Drop missing data 
metadata<-filter(metadata,!(is.na(Country.Region) | is.na(Population) ))
# Convert remaining pop to numeric
metadata$Population<-as.numeric(metadata$Population)
## Warning: NAs introduced by coercion
# Add metadata to cases
Corona_Cases<-merge(Corona_Cases,metadata,all.x = T)

##------------------------------------------
## Compute total and death cases relative to population 
##------------------------------------------

Corona_Cases$Total_confirmed_cases.per100<-100*Corona_Cases$Total_confirmed_cases/Corona_Cases$Population
Corona_Cases$Total_confirmed_deaths.per100<-100*Corona_Cases$Total_confirmed_deaths/Corona_Cases$Population


##------------------------------------------
## Filter df for US state-wide stats
##------------------------------------------

Corona_Cases.US_state<-filter(Corona_Cases,Country.Region=="US_state" & Total_confirmed_cases>0 ) 
kable(table(select(Corona_Cases.US_state,c("Province.State"))),caption = "Number of longitudinal datapoints (total/death) per state")
Number of longitudinal datapoints (total/death) per state
Var1 Freq
Alabama 3998
Alaska 732
Arizona 1016
Arkansas 4155
California 3876
Colorado 3645
Connecticut 601
Delaware 247
Diamond Princess 67
District of Columbia 68
Florida 4294
Georgia 9527
Grand Princess 68
Guam 68
Hawaii 352
Idaho 1892
Illinois 5400
Indiana 5549
Iowa 4985
Kansas 4084
Kentucky 6001
Louisiana 4020
Maine 1019
Maryland 1577
Massachusetts 1029
Michigan 4832
Minnesota 4503
Mississippi 4981
Missouri 5437
Montana 1700
Nebraska 3044
Nevada 751
New Hampshire 708
New Jersey 1532
New Mexico 1652
New York 3859
North Carolina 5836
North Dakota 1924
Northern Mariana Islands 53
Ohio 5213
Oklahoma 3903
Oregon 2009
Pennsylvania 4132
Puerto Rico 68
Rhode Island 400
South Carolina 2915
South Dakota 2460
Tennessee 5622
Texas 11637
Utah 941
Vermont 945
Virgin Islands 68
Virginia 7332
Washington 2644
West Virginia 2640
Wisconsin 3914
Wyoming 1209
Corona_Cases.US_state<-merge(Corona_Cases.US_state,ddply(filter(Corona_Cases.US_state,Total_confirmed_cases>100),c("Province.State"),summarise,case100_date_state=min(Date.numeric)))
Corona_Cases.US_state$Days_since_100_state<-Corona_Cases.US_state$Date.numeric-Corona_Cases.US_state$case100_date_state

ANALYSIS

Q1: What is the trend in cases, mortality across geopgraphical regions?

Plot # of cases vs time
* For each geographical set:
* comparative longitudinal case trend (absolute & log scale)
* comparative longitudinal mortality trend
* death vs total correlation

question dataset x y color facet pch dimentions
comparative_longitudinal_case_trend long time log_cases geography none (case type?) case_type [15, 50, 4] geography x (2 scale?) case type
comparative longitudinal case trend long time cases geography case_type ? [15, 50, 4] geography x (2+ scale) case type
comparative longitudinal mortality trend wide time mortality rate geography none none [15, 50, 4] geography
death vs total correlation wide cases deaths geography none none [15, 50, 4] geography
# total cases vs time
# death cases vs time
# mortality rate vs time
# death vs mortality


  # death vs mortality
  # total & death case vs time (same plot)

#<question> <x> <y> <colored> <facet> <dataset>
## trend in case/deaths over time, comapred across regions <time> <log cases> <geography*> <none> <.wide>
## trend in case/deaths over time, comapred across regions <time> <cases> <geography*> <case_type> <.long>
## trend in mortality rate over time, comapred across regions <time> <mortality rate> <geography*> <none>
## how are death/mortality related/correlated? <time> <log cases> <geography*> <none>
## how are death and case load correlated? <cases> <deaths>

# lm for each?? - > apply lm from each region starting from 100th case. m, b associated with each.
    # input: geographical regsion, logcase vs day (100th case)
    # output: m, b for each geographical region ID



#total/death on same plot-  diffeer by 2 logs, so when plotting log, use pch. when plotting absolute, need to use free scales
#when plotting death and case on same, melt. 

#CoronaCases - > filter sets (3)
  #world - choose countries with sufficent data

N<-ddply(filter(Corona_Cases,Total_confirmed_cases>100),c("Country.Region"),summarise,n=length(Country.Region))
ggplot(filter(N,n<100),aes(x=n))+
  geom_histogram()+
  default_theme+
  ggtitle("Distribution of number of days with at least 100 confirmed cases for each region")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

kable(arrange(N,-n),caption="Sorted number of days with at least 100 confirmed cases")
Sorted number of days with at least 100 confirmed cases
Country.Region n
US_state 34573
China 122
Diamond Princess 103
Korea, South 93
Japan 92
Italy 90
Iran 87
Singapore 84
France 83
Germany 83
Spain 82
US 81
Switzerland 79
United Kingdom 79
Belgium 78
Netherlands 78
Norway 78
Sweden 78
Austria 76
Malaysia 75
Australia 74
Bahrain 74
Denmark 74
Canada 73
Qatar 73
Iceland 72
Brazil 71
Czechia 71
Finland 71
Greece 71
Iraq 71
Israel 71
Portugal 71
Slovenia 71
Egypt 70
Estonia 70
India 70
Ireland 70
Kuwait 70
Philippines 70
Poland 70
Romania 70
Saudi Arabia 70
Indonesia 69
Lebanon 69
San Marino 69
Thailand 69
Chile 68
Pakistan 68
Luxembourg 67
Peru 67
Russia 67
Ecuador 66
Mexico 66
Slovakia 66
South Africa 66
United Arab Emirates 66
Armenia 65
Colombia 65
Croatia 65
Panama 65
Serbia 65
Taiwan* 65
Turkey 65
Argentina 64
Bulgaria 64
Latvia 64
Uruguay 64
Algeria 63
Costa Rica 63
Dominican Republic 63
Hungary 63
Andorra 62
Bosnia and Herzegovina 62
Jordan 62
Lithuania 62
Morocco 62
New Zealand 62
North Macedonia 62
Vietnam 62
Albania 61
Cyprus 61
Malta 61
Moldova 61
Brunei 60
Burkina Faso 60
Sri Lanka 60
Tunisia 60
Ukraine 59
Azerbaijan 58
Ghana 58
Kazakhstan 58
Oman 58
Senegal 58
Venezuela 58
Afghanistan 57
Cote d’Ivoire 57
Cuba 56
Mauritius 56
Uzbekistan 56
Cambodia 55
Cameroon 55
Honduras 55
Nigeria 55
West Bank and Gaza 55
Belarus 54
Georgia 54
Bolivia 53
Kosovo 53
Kyrgyzstan 53
Montenegro 53
Congo (Kinshasa) 52
Kenya 51
Niger 50
Guinea 49
Rwanda 49
Trinidad and Tobago 49
Paraguay 48
Bangladesh 47
Djibouti 45
El Salvador 44
Guatemala 43
Madagascar 42
Mali 41
Congo (Brazzaville) 38
Jamaica 38
Gabon 36
Somalia 36
Tanzania 36
Ethiopia 35
Burma 34
Sudan 33
Liberia 32
Maldives 30
Equatorial Guinea 29
Cabo Verde 27
Sierra Leone 25
Guinea-Bissau 24
Togo 24
Zambia 23
Eswatini 22
Chad 21
Tajikistan 20
Haiti 18
Sao Tome and Principe 18
Benin 16
Nepal 16
Uganda 16
Central African Republic 15
South Sudan 15
Guyana 13
Mozambique 12
Yemen 8
Mongolia 7
Mauritania 4
Nicaragua 4
# Pick top 15 countries with data
max_colors<-12
# find way to fix this- China has diff provences. Plot doesnt look right...
sufficient_data<-arrange(filter(N,!Country.Region %in% c("US_state", "Diamond Princess")),-n)[1:max_colors,]
kable(sufficient_data,caption = paste0("Top ",max_colors," countries with sufficient data"))
Top 12 countries with sufficient data
Country.Region n
China 122
Korea, South 93
Japan 92
Italy 90
Iran 87
Singapore 84
France 83
Germany 83
Spain 82
US 81
Switzerland 79
United Kingdom 79
Corona_Cases.world<-filter(Corona_Cases,Country.Region %in% c(sufficient_data$Country.Region))


  #us 
  #    - by state
Corona_Cases.US<-filter(Corona_Cases,Country.Region=="US" & Total_confirmed_cases>0)
# summarize 
#!City %in% c("Unassigned") 
  #    - specific cities
#mortality_rate!=Inf & mortality_rate<=1
Corona_Cases.UScity<-filter(Corona_Cases,Province.State %in% c("Pennsylvania","Maryland","New York","New Jersey") & City %in% c("Bucks","Baltimore City", "New York","Burlington","Cape May"))

measure_vars_long<-c("Total_confirmed_cases.log","Total_confirmed_cases","Total_confirmed_deaths","Total_confirmed_deaths.log")
melt_arg_list<-list(variable.name = "case_type",value.name = "cases",measure.vars = c("Total_confirmed_cases","Total_confirmed_deaths"))
melt_arg_list$data=NULL


melt_arg_list$data=select(Corona_Cases.world,-ends_with(match = "log"))
Corona_Cases.world.long<-do.call(melt,melt_arg_list)
melt_arg_list$data=select(Corona_Cases.UScity,-ends_with(match = "log"))
Corona_Cases.UScity.long<-do.call(melt,melt_arg_list)
melt_arg_list$data=select(Corona_Cases.US_state,-ends_with(match = "log"))
Corona_Cases.US_state.long<-do.call(melt,melt_arg_list)

Corona_Cases.world.long$cases.log<-log(Corona_Cases.world.long$cases,10)
Corona_Cases.US_state.long$cases.log<-log(Corona_Cases.US_state.long$cases,10)
Corona_Cases.UScity.long$cases.log<-log(Corona_Cases.UScity.long$cases,10)


# what is the current death and total case load for US? For world? For states?
#-absolute
#-log

# what is mortality rate (US, world)
#-absolute

#how is death and case correlated? (US, world)
#-absolute
#Corona_Cases.US<-filter(Corona_Cases,Country.Region=="US" & Total_confirmed_cases>0)
#Corona_Cases.US.case100<-filter(Corona_Cases.US, Days_since_100>=0)
# linear model parameters
#(model_fit<-lm(formula = Total_confirmed_cases.log~Days_since_100,data= Corona_Cases.US.case100 ))

#(slope<-model_fit$coefficients[2])
#(intercept<-model_fit$coefficients[1])

# Correlation coefficient
#cor(x = Corona_Cases.US.case100$Days_since_100,y = Corona_Cases.US.case100$Total_confirmed_cases.log)

##------------------------------------------
## Plot World Data
##------------------------------------------
# Timestamp for world
timestamp_plot.world<-paste("Most recent date for which data available:",max(Corona_Cases.world$Date))#timestamp(quiet = T,prefix = "Updated ",suffix = " (EST)")


# Base template for plots
baseplot.world<-ggplot(data=NULL,aes(x=Days_since_100,col=Country.Region))+
  default_theme+
  scale_color_brewer(type = "qualitative",palette = "Paired")+
  ggtitle(paste("Log10 cases over time,",timestamp_plot.world))+
  theme(legend.position = "bottom",plot.title = element_text(size=12))


##/////////////////////////
### Plot Longitudinal cases

(Corona_Cases.world.long.plot<-baseplot.world+
    geom_point(data=Corona_Cases.world.long,aes(y=cases))+
    geom_line(data=Corona_Cases.world.long,aes(y=cases))+
    facet_wrap(~case_type,scales = "free_y",ncol=1)+
    ggtitle(timestamp_plot.world)
    )

(Corona_Cases.world.loglong.plot<-baseplot.world+
    geom_point(data=Corona_Cases.world.long,aes(y=cases.log))+
    geom_line(data=Corona_Cases.world.long,aes(y=cases.log))+
    facet_wrap(~case_type,scales = "free_y",ncol=1)+
    ggtitle(timestamp_plot.world))

##/////////////////////////
### Plot Longitudinal mortality rate

(Corona_Cases.world.mortality.plot<-baseplot.world+
    geom_point(data=Corona_Cases.world,aes(y=mortality_rate))+
    geom_line(data=Corona_Cases.world,aes(y=mortality_rate))+
    ylim(c(0,0.3))+
    ggtitle(timestamp_plot.world))
## Warning: Removed 100 rows containing missing values (geom_point).
## Warning: Removed 100 row(s) containing missing values (geom_path).

##/////////////////////////
### Plot death vs total case correlation

(Corona_Cases.world.casecor.plot<-ggplot(Corona_Cases.world,aes(x=Total_confirmed_cases,y=Total_confirmed_deaths,col=Country.Region))+
  geom_point()+
  geom_line()+
  default_theme+
  scale_color_brewer(type = "qualitative",palette = "Paired")+
  ggtitle(paste("Log10 cases over time,",timestamp_plot.world))+
  theme(legend.position = "bottom",plot.title = element_text(size=12))+
    ggtitle(timestamp_plot.world))

### Write polots

write_plot(Corona_Cases.world.long.plot,wd = results_dir)
## [1] "/Users/stevensmith/Projects/coronavirus/results/Corona_Cases.world.long.plot.png"
write_plot(Corona_Cases.world.loglong.plot,wd = results_dir)
## [1] "/Users/stevensmith/Projects/coronavirus/results/Corona_Cases.world.loglong.plot.png"
write_plot(Corona_Cases.world.mortality.plot,wd = results_dir)
## Warning: Removed 100 rows containing missing values (geom_point).

## Warning: Removed 100 row(s) containing missing values (geom_path).
## [1] "/Users/stevensmith/Projects/coronavirus/results/Corona_Cases.world.mortality.plot.png"
write_plot(Corona_Cases.world.casecor.plot,wd = results_dir)
## [1] "/Users/stevensmith/Projects/coronavirus/results/Corona_Cases.world.casecor.plot.png"
##------------------------------------------
## Plot US State Data
##-----------------------------------------

baseplot.US<-ggplot(data=NULL,aes(x=Days_since_100_state,col=case_type))+
  default_theme+
  facet_wrap(~Province.State)+
  ggtitle(paste("Log10 cases over time,",timestamp_plot.world))

Corona_Cases.US_state.long.plot<-baseplot.US+geom_point(data=Corona_Cases.US_state.long,aes(y=cases.log))
##------------------------------------------
## Plot US City Data
##-----------------------------------------

Corona_Cases.US.plotdata<-filter(Corona_Cases.US_state,Province.State %in% c("Pennsylvania","Maryland","New York","New Jersey") &
                                   City %in% c("Bucks","Baltimore City", "New York","Burlington","Cape May") &
                                   Total_confirmed_cases>0) 
timestamp_plot<-paste("Most recent date for which data available:",max(Corona_Cases.US.plotdata$Date))#timestamp(quiet = T,prefix = "Updated ",suffix = " (EST)")

city_colors<-c("Bucks"='#beaed4',"Baltimore City"='#386cb0', "New York"='#7fc97f',"Burlington"='#fdc086',"Cape May"="#e78ac3")

##/////////////////////////
### Plot death vs total case correlation

(Corona_Cases.city.loglong.plot<-ggplot(melt(Corona_Cases.US.plotdata,measure.vars = c("Total_confirmed_cases.log","Total_confirmed_deaths.log"),variable.name = "case_type",value.name = "cases"),aes(x=Date,y=cases,col=City,pch=case_type))+
  geom_point(size=4)+
    geom_line()+
  default_theme+
  #facet_wrap(~case_type)+
    ggtitle(paste("Log10 total and death cases over time,",timestamp_plot))+
theme(legend.position = "bottom",plot.title = element_text(size=12),axis.text.x = element_text(angle=45,hjust=1))+
    scale_color_manual(values = city_colors)+
  scale_x_date(date_breaks="1 week",date_minor_breaks="1 day"))

(Corona_Cases.city.long.plot<-ggplot(filter(Corona_Cases.US.plotdata,Province.State !="New York"),aes(x=Date,y=Total_confirmed_cases,col=City))+
  geom_point(size=4)+
  geom_line()+
  default_theme+
  facet_grid(~Province.State,scales = "free_y")+
  ggtitle(paste("MD, PA, NJ total cases over time,",timestamp_plot))+
  theme(legend.position = "bottom",plot.title = element_text(size=12),axis.text.x = element_text(angle=45,hjust=1))
+
  scale_color_manual(values = city_colors)+
  scale_x_date(date_breaks="1 week",date_minor_breaks="1 day"))

(Corona_Cases.city.mortality.plot<-ggplot(Corona_Cases.US.plotdata,aes(x=Date,y=mortality_rate,col=City))+
  geom_point(size=3)+
  geom_line(size=2)+
  default_theme+
  ggtitle(paste("Mortality rate (deaths/total) over time,",timestamp_plot))+
  theme(legend.position = "bottom",plot.title = element_text(size=12),axis.text.x = element_text(angle=45,hjust=1))+
  scale_color_manual(values = city_colors)+
  scale_x_date(date_breaks="1 week",date_minor_breaks="1 day"))

(Corona_Cases.city.casecor.plot<-ggplot(filter(Corona_Cases.US.plotdata,Province.State !="New York"),aes(y=Total_confirmed_deaths,x=Total_confirmed_cases,col=City))+
  geom_point(size=3)+
  geom_line(size=2)+
  default_theme+
  ggtitle(paste("Correlation of death vs total cases,",timestamp_plot))+
  theme(legend.position = "bottom",plot.title = element_text(size=12))+
  scale_color_manual(values = city_colors))

(Corona_Cases.city.long.normalized.plot<-ggplot(filter(Corona_Cases.US.plotdata,Province.State !="New York"),aes(x=Date,y=Total_confirmed_cases.per100,col=City))+
  geom_point(size=4)+
  geom_line()+
  default_theme+
  facet_grid(~Province.State)+
  ggtitle(paste("MD, PA, NJ total cases over time per 100 people,",timestamp_plot))+
  theme(legend.position = "bottom",plot.title = element_text(size=12),axis.text.x = element_text(angle=45,hjust=1))+
  scale_color_manual(values = city_colors)  +
  scale_x_date(date_breaks="1 week",date_minor_breaks="1 day"))

write_plot(Corona_Cases.city.long.plot,wd = results_dir_custom)
## [1] "/Users/stevensmith/Projects/coronavirus/results/custom/Corona_Cases.city.long.plot.png"
write_plot(Corona_Cases.city.loglong.plot,wd = results_dir_custom)
## [1] "/Users/stevensmith/Projects/coronavirus/results/custom/Corona_Cases.city.loglong.plot.png"
write_plot(Corona_Cases.city.mortality.plot,wd = results_dir_custom)
## [1] "/Users/stevensmith/Projects/coronavirus/results/custom/Corona_Cases.city.mortality.plot.png"
write_plot(Corona_Cases.city.casecor.plot,wd = results_dir_custom)
## [1] "/Users/stevensmith/Projects/coronavirus/results/custom/Corona_Cases.city.casecor.plot.png"
write_plot(Corona_Cases.city.long.normalized.plot,wd = results_dir_custom)
## [1] "/Users/stevensmith/Projects/coronavirus/results/custom/Corona_Cases.city.long.normalized.plot.png"

Q1b what is the model

Fit the cases to a linear model 1. Find time at which the case vs date becomes linear in each plot
2. Fit linear model for each city

# What is the predict # of cases for the next few days?
# How is the model performing historically?

Corona_Cases.US_state.summary<-ddply(Corona_Cases.US_state,
                                     c("Province.State","Date"),
                                     summarise,
                                     Total_confirmed_cases_perstate=sum(Total_confirmed_cases)) %>% 
    filter(Total_confirmed_cases_perstate>100)

# Compute the states with the most cases (for coloring and for linear model)
top_states_totals<-head(ddply(Corona_Cases.US_state.summary,c("Province.State"),summarise, Total_confirmed_cases_perstate.max=max(Total_confirmed_cases_perstate)) %>% arrange(-Total_confirmed_cases_perstate.max),n=max_colors)

kable(top_states_totals,caption = "Top 12 States, total count ")
top_states<-top_states_totals$Province.State

# Manually fix states so that Maryland is switched out for New York
top_states_modified<-c(top_states[top_states !="New York"],"Maryland")

# Plot with all states:
(Corona_Cases.US_state.summary.plot<-ggplot(Corona_Cases.US_state.summary,aes(x=Date,y=Total_confirmed_cases_perstate))+
  geom_point()+
  geom_point(data=filter(Corona_Cases.US_state.summary,Province.State %in% top_states),aes(col=Province.State))+
  scale_color_brewer(type = "qualitative",palette = "Paired")+
  default_theme+
  theme(axis.text.x = element_text(angle=45,hjust=1),legend.position = "bottom")+
  ggtitle("Total confirmed cases per state, top 12 colored")+
  scale_x_date(date_breaks="1 week",date_minor_breaks="1 day"))

##------------------------------------------
## Fit linear model to time vs total cases
##-----------------------------------------

# First, find the date at which each state's cases vs time becomes lienar (2nd derivative is about 0)
li<-ddply(Corona_Cases.US_state.summary,c("Province.State"),find_linear_index)

# Compute linear model for each state starting at the point at which data becomes linear
for(i in 1:nrow(li)){
  Province.State.i<-li[i,"Province.State"]
  date.i<-li[i,"V1"]
  data.i<-filter(Corona_Cases.US_state.summary,Province.State==Province.State.i & as.numeric(Date) >= date.i)
  model_results<-lm(data.i,formula = Total_confirmed_cases_perstate~Date)
  slope<-model_results$coefficients[2]
  intercept<-model_results$coefficients[1]
  li[li$Province.State==Province.State.i,"m"]<-slope
  li[li$Province.State==Province.State.i,"b"]<-intercept
  }

# Compute top state case load with fitted model

(Corona_Cases.US_state.lm.plot<-ggplot(filter(Corona_Cases.US_state.summary,Province.State %in% top_states_modified ))+
    geom_abline(data=filter(li,Province.State %in% top_states_modified),
                aes(slope = m,intercept = b,col=Province.State),lty=2)+
    geom_point(aes(x=Date,y=Total_confirmed_cases_perstate,col=Province.State))+
    scale_color_brewer(type = "qualitative",palette = "Paired")+
    default_theme+
    theme(axis.text.x = element_text(angle=45,hjust=1),legend.position = "bottom")+
    ggtitle("Total confirmed cases per state, top 12 colored")+
    scale_x_date(date_breaks="1 week",date_minor_breaks="1 day"))

##------------------------------------------
## Predict the number of total cases over the next week
##-----------------------------------------

predicted_days<-c(0,1,2,3,7)+as.numeric(as.Date("2020-04-20"))

predicted_days_df<-data.frame(matrix(ncol=3))
names(predicted_days_df)<-c("Province.State","days","Total_confirmed_cases_perstate")

# USe model parameters to estiamte case loads
for(state.i in top_states_modified){
  predicted_days_df<-rbind(predicted_days_df,
                           data.frame(Province.State=state.i,
                                      prediction_model(m = li[li$Province.State==state.i,"m"],
                                                       b =li[li$Province.State==state.i,"b"] ,
                                                       days =predicted_days )))
  }

predicted_days_df$Date<-as.Date(predicted_days_df$days,origin="1970-01-01")

kable(predicted_days_df,caption = "Predicted total cases over the next week for selected states")

##------------------------------------------
## Write plots
##-----------------------------------------

write_plot(Corona_Cases.US_state.summary.plot,wd = results_dir)
write_plot(Corona_Cases.US_state.lm.plot,wd = results_dir)

##------------------------------------------
## Write tables
##-----------------------------------------

write.csv(predicted_days_df,file = paste0(results_dir,"predicted_total_cases_days.csv"),quote = F,row.names = F)

Q2: What is the predicted number of cases?

What is the prediction of COVID-19 based on model thus far? Additional questions:

WHy did it take to day 40 to start a log linear trend? How long will it be till x number of cases? When will the plateu happen? Are any effects noticed with social distancing? Delays

##------------------------------------------
## Prediction and Prediction Accuracy
##------------------------------------------


today_num<-max(Corona_Cases.US$Days_since_100)
predicted_days<-today_num+c(1,2,3,7)

#mods = dlply(mydf, .(x3), lm, formula = y ~ x1 + x2)
#today:
Corona_Cases.US[Corona_Cases.US$Days_since_100==(today_num-1),]
Corona_Cases.US[Corona_Cases.US$Days_since_100==today_num,]
Corona_Cases.US$type<-"Historical"


#prediction_values<-prediction_model(m=slope,b=intercept,days = predicted_days)$Total_confirmed_cases

histoical_model<-data.frame(date=today_num,m=slope,b=intercept)
tmp<-data.frame(state=rep(c("A","B"),each=3),x=c(1,2,3,4,5,6))
tmp$y<-c(tmp[1:3,"x"]+5,tmp[4:6,"x"]*5+1)
ddply(tmp,c("state"))
lm(data =tmp,formula = y~x )

train_lm<-function(input_data,subset_coulmn,formula_input){
case_models <- dlply(input_data, subset_coulmn, lm, formula = formula_input)
case_models.parameters <- ldply(case_models, coef)
case_models.parameters<-rename(case_models.parameters,c("b"="(Intercept)","m"=subset_coulmn))
return(case_models.parameters)
}

train_lm(tmp,"state")

 dlply(input_data, subset_coulmn, lm,m=)
 
# model for previous y days
#historical_model_predictions<-data.frame(day_x=NULL,Days_since_100=NULL,Total_confirmed_cases=NULL,Total_confirmed_cases.log=NULL)
# for(i in c(1,2,3,4,5,6,7,8,9,10)){
#   #i<-1
# day_x<-today_num-i # 1, 2, 3, 4
# day_x_nextweek<-day_x+c(1,2,3)
# model_fit_x<-lm(data = filter(Corona_Cases.US.case100,Days_since_100 < day_x),formula = Total_confirmed_cases.log~Days_since_100)
# prediction_day_x_nextweek<-prediction_model(m = model_fit_x$coefficients[2],b = model_fit_x$coefficients[1],days = day_x_nextweek)
# prediction_day_x_nextweek$type<-"Predicted"
# acutal_day_x_nextweek<-filter(Corona_Cases.US,Days_since_100 %in% day_x_nextweek) %>% select(c(Days_since_100,Total_confirmed_cases,Total_confirmed_cases.log))
# acutal_day_x_nextweek$type<-"Historical"
# historical_model_predictions.i<-data.frame(day_x=day_x,rbind(acutal_day_x_nextweek,prediction_day_x_nextweek))
# historical_model_predictions<-rbind(historical_model_predictions.i,historical_model_predictions)
# }

#historical_model_predictions.withHx<-rbind.fill(historical_model_predictions,data.frame(Corona_Cases.US,type="Historical"))
#historical_model_predictions.withHx$Total_confirmed_cases.log2<-log(historical_model_predictions.withHx$Total_confirmed_cases,2)

(historical_model_predictions.plot<-ggplot(historical_model_predictions.withHx,aes(x=Days_since_100,y=Total_confirmed_cases.log,col=type))+
    geom_point(size=3)+
    default_theme+
    theme(legend.position = "bottom")+ 
      #geom_abline(slope = slope,intercept =intercept,lty=2)+
    #facet_wrap(~case_type,ncol=1)+
    scale_color_manual(values = c("Historical"="#377eb8","Predicted"="#e41a1c")))
write_plot(historical_model_predictions.plot,wd=results_dir)

Q3: What is the effect on social distancing, descreased mobility on case load?

Load data from Google which compoutes % change in user mobility relative to baseline for * Recreation
* Workplace
* Residence
* Park
* Grocery

Data from https://www.google.com/covid19/mobility/

# See pre-processing section for script on gathering mobility data

# UNDER DEVELOPMENT

mobility<-read.csv("/Users/stevensmith/Projects/MIT_COVID19/mobility.csv",header = T,stringsAsFactors = F)
#mobility$Retail_Recreation<-as.numeric(sub(mobility$Retail_Recreation,pattern = "%",replacement = ""))
#mobility$Workplace<-as.numeric(sub(mobility$Workplace,pattern = "%",replacement = ""))
#mobility$Residential<-as.numeric(sub(mobility$Residential,pattern = "%",replacement = ""))

##------------------------------------------
## Show relationship between mobility and caseload
##------------------------------------------
mobility$County<-gsub(mobility$County,pattern = " County",replacement = "")
Corona_Cases.US_state.mobility<-merge(Corona_Cases.US_state,plyr::rename(mobility,c("State"="Province.State","County"="City")))

#Corona_Cases.US_state.tmp<-merge(metadata,Corona_Cases.US_state.tmp)
# Needs to happen upsteam, see todos
#Corona_Cases.US_state.tmp$Total_confirmed_cases.perperson<-Corona_Cases.US_state.tmp$Total_confirmed_cases/as.numeric(Corona_Cases.US_state.tmp$Population)
mobility_measures<-c("Retail_Recreation","Grocery_Pharmacy","Parks","Transit","Workplace","Residential")

plot_data<-filter(Corona_Cases.US_state.mobility, Date.numeric==max(Corona_Cases.US_state$Date.numeric) ) %>% melt(measure.vars=mobility_measures) 
plot_data$value<-as.numeric(gsub(plot_data$value,pattern = "%",replacement = ""))
plot_data<-filter(plot_data,!is.na(value))

(mobility.plot<-ggplot(filter(plot_data,Province.State %in% c("Pennsylvania","Maryland","New Jersey","California","Delaware","Connecticut")),aes(y=Total_confirmed_cases.per100,x=value))+geom_point()+
  facet_grid(Province.State~variable,scales = "free")+
  xlab("Mobility change from baseline (%)")+
  ylab(paste0("Confirmed cases per 100 people(Today)"))+
  default_theme+
  ggtitle("Mobility change vs cases"))

(mobility.global.plot<-ggplot(plot_data,aes(y=Total_confirmed_cases.per100,x=value))+geom_point()+
  facet_wrap(~variable,scales = "free")+
  xlab("Mobility change from baseline (%)")+
  ylab(paste0("Confirmed cases (Today) per 100 people"))+
  default_theme+
  ggtitle("Mobility change vs cases"))

plot_data.permobility_summary<-ddply(plot_data,c("Province.State","variable"),summarise,cor=cor(y =Total_confirmed_cases.per100,x=value),median_change=median(x=value)) %>% arrange(-abs(cor))

kable(plot_data.permobility_summary,caption = "Ranked per-state mobility correlation with total confirmed cases")
Ranked per-state mobility correlation with total confirmed cases
Province.State variable cor median_change
Alaska Transit -1.0000000 -63.0
Delaware Retail_Recreation 1.0000000 -39.5
Delaware Grocery_Pharmacy 1.0000000 -17.5
Delaware Parks -1.0000000 20.5
Delaware Transit 1.0000000 -37.0
Delaware Workplace 1.0000000 -37.0
Delaware Residential -1.0000000 14.0
Hawaii Retail_Recreation 0.9931972 -56.0
Hawaii Grocery_Pharmacy 0.9695437 -34.0
New Hampshire Parks 0.9577664 -20.0
Maine Transit -0.9019607 -50.0
Connecticut Grocery_Pharmacy -0.9008686 -6.0
Alaska Residential 0.8865220 13.0
South Dakota Parks 0.8734459 -26.0
Vermont Parks 0.8519884 -35.5
Utah Residential -0.8442619 12.0
Alaska Grocery_Pharmacy -0.8018082 -7.0
Hawaii Residential -0.7854909 19.0
Utah Transit -0.7741844 -18.0
Massachusetts Workplace -0.7724905 -39.0
Rhode Island Workplace -0.7456259 -39.5
Connecticut Transit -0.7426978 -50.0
Wyoming Transit -0.7310132 -17.0
Alaska Workplace -0.7307515 -34.0
Utah Parks -0.7042609 17.0
Hawaii Parks 0.6813458 -72.0
Wyoming Parks -0.6813353 -4.0
Utah Workplace -0.6652605 -37.0
Vermont Grocery_Pharmacy -0.6583520 -25.0
Maine Workplace -0.6523871 -30.0
New York Workplace -0.6445703 -34.5
Rhode Island Retail_Recreation -0.6308460 -45.0
Montana Workplace -0.6239388 -40.5
Rhode Island Residential -0.6192259 18.5
Hawaii Transit 0.6188732 -89.0
Arizona Grocery_Pharmacy -0.6185090 -15.0
New Jersey Workplace -0.6134137 -44.0
Nebraska Workplace 0.6077698 -32.5
New Jersey Parks -0.5949860 -6.0
New York Retail_Recreation -0.5871155 -46.0
North Dakota Retail_Recreation -0.5652488 -42.0
Hawaii Workplace 0.5396454 -46.0
Massachusetts Retail_Recreation -0.5311054 -44.0
Connecticut Residential 0.5293540 14.0
New York Parks 0.5264212 20.0
New Jersey Retail_Recreation -0.5121058 -62.5
Connecticut Retail_Recreation -0.5106054 -45.0
Maine Parks 0.5024457 -31.0
Arizona Retail_Recreation -0.4966567 -42.5
Connecticut Workplace -0.4918982 -39.0
Montana Parks -0.4913929 -58.0
Nebraska Residential -0.4876127 14.0
New Jersey Grocery_Pharmacy -0.4850369 2.5
Wyoming Workplace -0.4830710 -31.0
North Dakota Parks 0.4821135 -34.0
Iowa Parks -0.4794606 28.5
New Mexico Grocery_Pharmacy -0.4793089 -11.0
Rhode Island Parks 0.4789527 52.0
Montana Residential 0.4701424 14.0
New Mexico Parks 0.4548477 -31.5
Illinois Transit -0.4503892 -31.0
New Mexico Residential 0.4491212 13.5
Arkansas Parks -0.4377537 -12.0
Idaho Workplace -0.4374387 -29.0
Wisconsin Transit -0.4356038 -23.5
Vermont Residential 0.4344794 11.5
Kentucky Parks -0.4336798 28.5
California Transit -0.4330369 -42.0
Massachusetts Grocery_Pharmacy -0.4330151 -7.0
Pennsylvania Workplace -0.4321980 -36.0
California Residential 0.4285318 14.0
New Jersey Transit -0.4233417 -50.5
Kansas Parks 0.4189928 72.0
South Carolina Workplace 0.4182213 -30.0
Montana Retail_Recreation -0.4145442 -51.0
New Hampshire Residential -0.4114412 14.0
Idaho Transit -0.4084972 -30.0
Idaho Grocery_Pharmacy -0.4036292 -4.5
Alabama Workplace -0.3989699 -29.0
Maryland Workplace -0.3920281 -35.0
Montana Transit -0.3892824 -41.0
Maryland Grocery_Pharmacy -0.3855314 -10.0
Arizona Residential 0.3840830 13.0
Alabama Grocery_Pharmacy -0.3774172 -2.0
New York Transit -0.3748196 -48.0
Florida Residential 0.3615828 14.0
New Mexico Retail_Recreation -0.3574663 -42.5
Pennsylvania Retail_Recreation -0.3564418 -45.0
Arizona Transit 0.3562880 -38.0
Wyoming Grocery_Pharmacy -0.3553129 -10.0
Alabama Transit -0.3509789 -36.5
California Parks -0.3476668 -38.5
Nevada Transit -0.3443698 -20.0
Nebraska Grocery_Pharmacy 0.3331740 -0.5
Michigan Parks 0.3318866 30.0
Pennsylvania Parks 0.3288691 13.0
Montana Grocery_Pharmacy -0.3279939 -16.0
West Virginia Parks 0.3239758 -33.0
Minnesota Transit -0.3164657 -28.5
Alaska Retail_Recreation 0.3115519 -39.0
Idaho Retail_Recreation -0.3048434 -40.5
West Virginia Grocery_Pharmacy -0.3040290 -6.0
North Carolina Grocery_Pharmacy 0.3013447 0.0
North Dakota Workplace 0.3006633 -40.0
Vermont Retail_Recreation 0.2944472 -57.0
Maine Retail_Recreation -0.2942048 -42.0
Colorado Residential 0.2913020 14.0
Utah Retail_Recreation -0.2892028 -40.0
Texas Workplace 0.2834660 -32.0
Rhode Island Transit -0.2815205 -56.0
Texas Residential -0.2802195 15.0
Mississippi Residential 0.2781565 13.0
Arkansas Retail_Recreation -0.2762701 -30.0
California Retail_Recreation -0.2752242 -44.0
Kansas Workplace 0.2751617 -32.5
Oregon Grocery_Pharmacy 0.2741681 -7.0
Maryland Retail_Recreation -0.2689304 -39.0
Florida Parks -0.2669696 -43.0
Maryland Residential 0.2654499 15.0
California Grocery_Pharmacy -0.2654282 -12.0
North Carolina Workplace 0.2626827 -31.0
Nevada Residential 0.2625679 17.0
Nevada Retail_Recreation -0.2608993 -43.0
Virginia Transit -0.2602076 -33.0
Texas Parks 0.2546314 -42.0
Illinois Workplace -0.2538437 -31.0
Rhode Island Grocery_Pharmacy 0.2534110 -7.5
Tennessee Workplace -0.2512295 -31.0
Wisconsin Parks 0.2508012 51.5
Georgia Grocery_Pharmacy -0.2466553 -10.0
Tennessee Residential 0.2464916 11.5
California Workplace -0.2440296 -36.0
Pennsylvania Grocery_Pharmacy -0.2368227 -6.0
Illinois Parks 0.2361740 26.5
Arkansas Residential 0.2355313 12.0
South Carolina Parks -0.2332614 -23.0
New York Grocery_Pharmacy -0.2321411 8.0
Vermont Workplace -0.2251506 -43.0
North Carolina Transit 0.2214969 -32.0
Washington Workplace -0.2199559 -38.0
Michigan Workplace -0.2193366 -40.0
New Jersey Residential 0.2113196 18.0
North Carolina Residential 0.2110657 13.0
Missouri Residential -0.2089356 13.0
Oregon Residential 0.2070753 10.5
Kansas Grocery_Pharmacy -0.1995773 -14.0
Iowa Transit 0.1983399 -24.0
Mississippi Grocery_Pharmacy -0.1916155 -8.0
South Dakota Transit -0.1896822 -40.0
Georgia Workplace -0.1886283 -33.5
Missouri Workplace 0.1879652 -28.5
Wyoming Retail_Recreation -0.1875369 -39.0
Illinois Residential 0.1872978 14.0
North Dakota Grocery_Pharmacy -0.1853445 -8.0
Alabama Parks 0.1816788 -1.0
Idaho Residential -0.1806540 11.0
Colorado Parks -0.1785372 2.0
Texas Transit 0.1703258 -41.5
Virginia Grocery_Pharmacy -0.1696530 -8.0
Georgia Retail_Recreation -0.1680732 -41.0
New Mexico Transit 0.1679544 -38.5
Oklahoma Residential 0.1652791 15.0
Ohio Transit 0.1646037 -28.0
Virginia Parks 0.1630037 6.0
Georgia Residential -0.1625841 13.0
Wisconsin Residential -0.1625415 14.0
Virginia Residential 0.1615976 14.0
Oklahoma Parks -0.1561827 -18.5
South Carolina Residential -0.1537867 12.0
Washington Transit -0.1504574 -33.5
Massachusetts Transit -0.1476604 -45.0
Michigan Retail_Recreation -0.1469310 -53.0
Washington Residential 0.1462162 13.0
Florida Retail_Recreation 0.1454895 -43.0
Maine Residential -0.1450939 11.0
North Dakota Transit 0.1440657 -48.0
New Hampshire Retail_Recreation -0.1435735 -41.0
Oregon Retail_Recreation 0.1417567 -41.0
Indiana Residential 0.1414525 12.0
Nebraska Parks 0.1409051 55.5
South Dakota Retail_Recreation -0.1407406 -38.5
Massachusetts Parks 0.1380127 39.0
Indiana Retail_Recreation 0.1370668 -38.0
Florida Workplace -0.1358516 -33.0
Connecticut Parks 0.1353866 43.0
Mississippi Transit -0.1351118 -38.5
Alabama Retail_Recreation 0.1314817 -39.0
Pennsylvania Transit -0.1310847 -41.5
Maine Grocery_Pharmacy -0.1270885 -13.0
Ohio Parks -0.1250336 67.5
Massachusetts Residential 0.1241818 15.0
Minnesota Workplace -0.1205160 -33.0
Wisconsin Workplace -0.1204846 -31.0
South Dakota Residential 0.1203839 15.0
New Hampshire Grocery_Pharmacy -0.1200981 -6.0
North Carolina Parks -0.1199144 7.0
Minnesota Parks 0.1188688 -9.0
Oregon Parks 0.1172339 16.5
Mississippi Retail_Recreation -0.1171623 -40.0
Kansas Transit -0.1168994 -26.5
Washington Grocery_Pharmacy 0.1163598 -7.0
Maryland Transit -0.1116298 -39.0
Idaho Parks 0.1110882 -22.0
Arkansas Transit 0.1091558 -27.0
West Virginia Residential -0.1087555 11.0
Arkansas Workplace -0.1085506 -26.0
Ohio Residential 0.1063887 14.0
New Hampshire Transit -0.1049450 -57.0
Mississippi Workplace -0.1045429 -33.0
Kentucky Grocery_Pharmacy 0.1036864 4.0
Kentucky Transit 0.1036816 -31.0
Nebraska Retail_Recreation 0.1018185 -36.0
Indiana Parks -0.1005194 29.0
Arizona Workplace -0.0971661 -35.0
Wisconsin Grocery_Pharmacy 0.0956729 -1.0
Michigan Grocery_Pharmacy -0.0951526 -11.0
Minnesota Retail_Recreation 0.0950703 -40.0
Pennsylvania Residential 0.0934695 15.0
Texas Grocery_Pharmacy 0.0921193 -14.0
New York Residential 0.0909835 17.5
Virginia Workplace -0.0891218 -31.5
Georgia Parks 0.0885167 -6.0
Missouri Transit -0.0884596 -24.5
Oklahoma Grocery_Pharmacy -0.0875630 -1.0
South Dakota Grocery_Pharmacy 0.0875548 -9.0
Indiana Workplace 0.0864125 -34.0
Washington Parks 0.0859680 -3.5
Wyoming Residential 0.0858529 12.5
Indiana Grocery_Pharmacy -0.0773376 -5.5
South Carolina Transit 0.0764140 -45.0
South Dakota Workplace 0.0753258 -35.0
Virginia Retail_Recreation -0.0746463 -35.0
Michigan Residential 0.0745576 15.0
Kentucky Retail_Recreation 0.0707782 -29.0
Colorado Transit 0.0688628 -36.0
Ohio Grocery_Pharmacy 0.0668278 0.0
Tennessee Parks -0.0657107 10.5
Nevada Workplace 0.0643793 -40.0
Iowa Retail_Recreation -0.0643200 -38.0
Michigan Transit 0.0636829 -46.0
Oregon Transit 0.0636673 -27.5
Oregon Workplace -0.0630124 -31.0
Ohio Retail_Recreation 0.0627569 -36.0
West Virginia Workplace 0.0612386 -33.0
Minnesota Grocery_Pharmacy 0.0590584 -6.5
Nevada Parks 0.0572275 -12.5
Iowa Workplace -0.0546789 -30.0
Oklahoma Workplace 0.0546204 -31.0
North Carolina Retail_Recreation 0.0535768 -34.0
West Virginia Retail_Recreation -0.0526565 -38.5
Kentucky Residential 0.0525406 12.0
Florida Transit -0.0519006 -49.0
Colorado Retail_Recreation -0.0508615 -44.0
South Carolina Grocery_Pharmacy 0.0504745 1.0
Colorado Grocery_Pharmacy -0.0495728 -17.0
South Carolina Retail_Recreation -0.0492234 -35.0
Texas Retail_Recreation 0.0487497 -40.0
Nebraska Transit -0.0482364 -9.0
Kentucky Workplace -0.0481269 -36.0
Washington Retail_Recreation -0.0480542 -42.0
Illinois Retail_Recreation 0.0473591 -40.0
Missouri Retail_Recreation -0.0458160 -36.0
Missouri Parks 0.0452556 0.0
New Hampshire Workplace 0.0449259 -37.0
Missouri Grocery_Pharmacy 0.0447937 2.0
Tennessee Transit -0.0425209 -32.0
Illinois Grocery_Pharmacy -0.0383775 2.0
Florida Grocery_Pharmacy 0.0321271 -14.0
Vermont Transit 0.0313868 -63.0
North Dakota Residential -0.0300995 17.0
Arizona Parks -0.0294248 -44.5
Oklahoma Retail_Recreation 0.0279326 -31.0
Tennessee Grocery_Pharmacy 0.0260561 6.0
Ohio Workplace -0.0244402 -35.0
Indiana Transit 0.0242466 -29.0
West Virginia Transit -0.0170546 -45.0
Nevada Grocery_Pharmacy 0.0167503 -12.5
Kansas Residential -0.0167300 13.0
Mississippi Parks -0.0148309 -25.0
Iowa Grocery_Pharmacy 0.0137871 4.0
Kansas Retail_Recreation -0.0131020 -37.0
Wisconsin Retail_Recreation 0.0126939 -44.0
Maryland Parks -0.0124993 27.0
Colorado Workplace -0.0115477 -39.0
Georgia Transit -0.0101315 -35.0
New Mexico Workplace 0.0071133 -34.0
Iowa Residential -0.0071017 13.0
Utah Grocery_Pharmacy 0.0063999 -4.0
Oklahoma Transit 0.0051743 -26.0
Arkansas Grocery_Pharmacy 0.0041609 3.0
Tennessee Retail_Recreation -0.0036060 -30.0
Minnesota Residential -0.0016743 17.0
Alabama Residential 0.0002762 11.0
Alaska Parks NA 29.0
District of Columbia Retail_Recreation NA -69.0
District of Columbia Grocery_Pharmacy NA -28.0
District of Columbia Parks NA -65.0
District of Columbia Transit NA -69.0
District of Columbia Workplace NA -48.0
District of Columbia Residential NA 17.0
# sanity check
ggplot(filter(plot_data,Province.State %in% c("Pennsylvania","Maryland","New Jersey","California","Delaware","Connecticut")),aes(x=Total_confirmed_cases.per100,fill=variable))+geom_histogram()+
  facet_grid(~Province.State)+
    default_theme+
  theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

write_plot(mobility.plot,wd = results_dir)
## [1] "/Users/stevensmith/Projects/coronavirus/results/mobility.plot.png"
write_plot(mobility.global.plot,wd = results_dir)
## [1] "/Users/stevensmith/Projects/coronavirus/results/mobility.global.plot.png"
(plot_data.permobility_summary.plot<-ggplot(plot_data.permobility_summary,aes(x=variable,y=median_change))+
  geom_jitter(size=2,width=.2)+
  #geom_jitter(data=plot_data.permobility_summary %>% arrange(-abs(median_change)) %>% head(n=15),aes(col=Province.State),size=2,width=.2)+
  default_theme+
  ggtitle("Per-Sate Median Change in Mobility")+
  xlab("Mobility Meaure")+
  ylab("Median Change from Baseline"))

write_plot(plot_data.permobility_summary.plot,wd = results_dir)
## [1] "/Users/stevensmith/Projects/coronavirus/results/plot_data.permobility_summary.plot.png"

DELIVERABLE MANIFEST

The following link to commited documents pushed to github. These are provided as a convienence, but note this is a manual process. The generation of reports, plots and tables is not coupled to the execution of this markdown. ## Report This report, html & pdf

Plots

github_root<-"https://github.com/sbs87/coronavirus/blob/master/"

plot_handle<-c("Corona_Cases.world.long.plot",
               "Corona_Cases.world.loglong.plot",
               "Corona_Cases.world.mortality.plot",
               "Corona_Cases.world.casecor.plot",
               "Corona_Cases.city.long.plot",
               "Corona_Cases.city.loglong.plot",
               "Corona_Cases.city.mortality.plot",
               "Corona_Cases.city.casecor.plot",
               "Corona_Cases.city.long.normalized.plot",
               "Corona_Cases.US_state.lm.plot",
               "Corona_Cases.US_state.summary.plot")


deliverable_manifest<-data.frame(
  name=c("World total & death cases, longitudinal",
         "World log total & death cases, longitudinal",
         "World mortality",
         "World total & death cases, correlation",
         "City total & death cases, longitudinal",
         "City log total & death cases, longitudinal",
         "City mortality",
         "City total & death cases, correlation",
         "City population normalized total & death cases, longitudinal",
         "State total cases (select) with linear model, longitudinal",
         "State total cases, longitudinal"),
  plot_handle=plot_handle,
  link=paste0(github_root,"results/",plot_handle,".png")
)


(tmp<-data.frame(row_out=apply(deliverable_manifest,MARGIN = 1,FUN = function(x) paste(x[1],x[2],x[3],sep=" | "))))
##                                                                                                                                                                                                        row_out
## 1                                           World total & death cases, longitudinal | Corona_Cases.world.long.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.long.plot.png
## 2                                 World log total & death cases, longitudinal | Corona_Cases.world.loglong.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.loglong.plot.png
## 3                                                         World mortality | Corona_Cases.world.mortality.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.mortality.plot.png
## 4                                      World total & death cases, correlation | Corona_Cases.world.casecor.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.casecor.plot.png
## 5                                              City total & death cases, longitudinal | Corona_Cases.city.long.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.long.plot.png
## 6                                    City log total & death cases, longitudinal | Corona_Cases.city.loglong.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.loglong.plot.png
## 7                                                            City mortality | Corona_Cases.city.mortality.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.mortality.plot.png
## 8                                         City total & death cases, correlation | Corona_Cases.city.casecor.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.casecor.plot.png
## 9  City population normalized total & death cases, longitudinal | Corona_Cases.city.long.normalized.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.long.normalized.plot.png
## 10                     State total cases (select) with linear model, longitudinal | Corona_Cases.US_state.lm.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.US_state.lm.plot.png
## 11                                      State total cases, longitudinal | Corona_Cases.US_state.summary.plot | https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.US_state.summary.plot.png
row_out<-apply(tmp, 2, paste, collapse="\t\n")
name handle link
World total & death cases, longitudinal Corona_Cases.world.long.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.long.plot.png
World log total & death cases, longitudinal Corona_Cases.world.loglong.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.loglong.plot.png
World mortality Corona_Cases.world.mortality.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.mortality.plot.png
World total & death cases, correlation Corona_Cases.world.casecor.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.world.casecor.plot.png
City total & death cases, longitudinal Corona_Cases.city.long.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.long.plot.png
City log total & death cases, longitudinal Corona_Cases.city.loglong.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.loglong.plot.png
City mortality Corona_Cases.city.mortality.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.mortality.plot.png
City total & death cases, correlation Corona_Cases.city.casecor.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.casecor.plot.png
City population normalized total & death cases, longitudinal Corona_Cases.city.long.normalized.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.city.long.normalized.plot.png
State total cases (select) with linear model, longitudinal Corona_Cases.US_state.lm.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.US_state.lm.plot.png
State total cases, longitudinal Corona_Cases.US_state.summary.plot https://github.com/sbs87/coronavirus/blob/master/results/Corona_Cases.US_state.summary.plot.png

Tables

CONCLUSION

Overall, the trends of COVID-19 cases is no longer in log-linear phase for world or U.S. (but some regions like MD are still in the log-linear phase). Mortality rate (deaths/confirmed RNA-based cases) is >1%, with a range depending on region. Mobility is not a strong indicator of caseload (U.S. data).

See table below for detailed breakdown.

Question Answer
What is the effect on social distancing, descreased mobility on case load?
There is not a strong apparent effect on decreased mobility (work, grocery, retail) or increased mobility (at residence, parks) on number of confirmed cases, either as a country (U.S.) or state level. California appears to have one of the best correlations, but this is a mixed bag
What is the trend in cases, mortality across geopgraphical regions?
The confirmed total casees and mortality is overall log-linear for most countries, with a trailing off beginning for most (inlcuding U.S.). On the state level, NY, NJ, PA starting to trail off; MD is still in log-linear phase. Mortality and case load are highly correlated for NY, NJ, PA, MD. The mortality rate flucutates for a given region, but is about 3% overall.

END

End: ##—— Sat May 23 10:52:26 2020 ——##

Cheatsheet: http://rmarkdown.rstudio.com>

Sandbox

# Geographical heatmap!
install.packages("maps")
library(maps)
library
mi_counties <- map_data("county", "pennsylvania") %>% 
  select(lon = long, lat, group, id = subregion)
head(mi_counties)

ggplot(mi_counties, aes(lon, lat)) + 
  geom_point(size = .25, show.legend = FALSE) +
  coord_quickmap()
mi_counties$cases<-1:2226
name_overlaps(metadata,Corona_Cases.US_state)

tmp<-merge(Corona_Cases.US_state,metadata)
ggplot(filter(tmp,Province.State=="Pennsylvania"), aes(Long, Lat, group = as.factor(City))) +
  geom_polygon(aes(fill = Total_confirmed_cases), colour = "grey50") + 
  coord_quickmap()


ggplot(Corona_Cases.US_state, aes(Long, Lat))+
  geom_polygon(aes(fill = Total_confirmed_cases ), color = "white")+
  scale_fill_viridis_c(option = "C")
dev.off()


require(maps)
require(viridis)

world_map <- map_data("world")
ggplot(world_map, aes(x = long, y = lat, group = group)) +
  geom_polygon(fill="lightgray", colour = "white")

head(world_map)
head(Corona_Cases.US_state)
unique(select(world_map,c("region","group"))) %>% filter()

some.eu.countries <- c(
  "US"
)
# Retrievethe map data
some.eu.maps <- map_data("world", region = some.eu.countries)

# Compute the centroid as the mean longitude and lattitude
# Used as label coordinate for country's names
region.lab.data <- some.eu.maps %>%
  group_by(region) %>%
  summarise(long = mean(long), lat = mean(lat))

unique(filter(some.eu.maps,subregion %in% Corona_Cases.US_state$Province.State) %>% select(subregion))
unique(Corona_Cases.US_state$Total_confirmed_cases.log)
ggplot(filter(Corona_Cases.US_state,Date=="2020-04-17") aes(x = Long, y = Lat)) +
  geom_polygon(aes( fill = Total_confirmed_cases.log))+
  #geom_text(aes(label = region), data = region.lab.data,  size = 3, hjust = 0.5)+
  #scale_fill_viridis_d()+
  #theme_void()+
  theme(legend.position = "none")
library("sf")
library("rnaturalearth")
library("rnaturalearthdata")

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)
ggplot(data = world) +
    geom_sf()

counties <- st_as_sf(map("county", plot = FALSE, fill = TRUE))
counties <- subset(counties, grepl("florida", counties$ID))
counties$area <- as.numeric(st_area(counties))
#install.packages("lwgeom")
class(counties)
head(counties)
ggplot(data = world) +
    geom_sf(data=Corona_Cases.US_state) +
    #geom_sf(data = counties, aes(fill = area)) +
  geom_sf(data = counties, aes(fill = area)) +
   # scale_fill_viridis_c(trans = "sqrt", alpha = .4) +
    coord_sf(xlim = c(-88, -78), ylim = c(24.5, 33), expand = FALSE)


head(counties)
tmp<-unique(select(filter(Corona_Cases.US_state,Date=="2020-04-17"),c(Lat,Long,Total_confirmed_cases.per100)))
st_as_sf(map("county", plot = FALSE, fill = TRUE))

join::inner_join.sf(Corona_Cases.US_state, counties)

library(sf)
library(sp)

nc <- st_read(system.file("shape/nc.shp", package="sf"))
class(nc)


spdf <- SpatialPointsDataFrame(coords = select(Corona_Cases.US_state,c("Lat","Long")), data = Corona_Cases.US_state,
                               proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))

head(spdf)
class(spdf)
st_cast(spdf)

filter(Corona_Cases.US_state.summary,Date=="2020-04-20" & Province.State %in% top_states_modified)
id

https://stevenbsmith.net